/**
 * 前台元素监听器，采用layer独立模块
 * 用于ajax的预加载动画、ajax加载嵌入式弹窗、减少js代码量
 * 拆分式写法，对象的方法独立性强
 **/
window.ICY8 = {
    code: {
        ajaxSuccess: 200,
        ajaxError: 300,
        ajaxNotLogin: 301
    },
    // 空函数
    noop: function () {
    },
    loading: false, // 加载层的index
    loading_fn: function () {
        // 默认加载层
        ICY8.loading = layer.load(1, {shade: 0.3, isOutAnim: false});
    },
    error_fn: function (XMLHttpRequest, textStatus, errorThrown) {
        layer.msg('页面加载错误', {time: 1200, shadeClose: true});
        ICY8.close_loading();
    },
    close_loading: function () {
        // 关闭加载层
        if (this.loading) {
            layer.close(this.loading);
        }
    },
    randNum: function (n) {
        var rand = "";
        for (var i = 0; i < n; i++) {
            rand += Math.floor(Math.random() * 10);
        }
        return rand;
    },

    str2json: function ($obj) {
        if (typeof $obj == 'string' && $obj.trim().length > 0) {
            return eval('(' + $obj + ')');
        }
        return $obj;
    },

    json2str: function ($obj) {
        return JSON.stringify($obj);
    },
    ajax: function (opt, callback) {
        // ajax加载，有预加载动画
        var option = {
            type: 'get',
            dataType: 'json',
            beforeSend: ICY8.loading_fn,
            success: function (data) {
                ICY8.close_loading();
                if (typeof callback == 'function') {
                    callback(data);
                }
            },
            error: ICY8.error_fn,
        };//默认配置 默认get提交
        if (typeof opt == 'string') {
            // 不支持string
            option = {url: opt, type: 'get', dataType: 'json', data: {},}
        } else {
            $.extend(true, option, opt);// 配置碰撞
        }
        $.ajax(option);
    },
    ajaxSubmit: function (elem, callback) {
        // 避免file上传表单实现不了 采用jquery.form.js插件
        // ajax加载，有预加载动画
        var option = {dataType: 'json'};//默认配置 默认get提交
        var opt = $(elem).data('option');
        opt = this.str2json(opt);
        $.extend(true, option, opt);// 配置碰撞
        option.beforeSubmit = ICY8.loading_fn;
        option.success = function (data) {
            if (typeof callback == 'function') {
                callback(data, this);
            }
            ICY8.close_loading();
        };
        option.error = ICY8.error_fn;
        $(elem).ajaxSubmit(option);
    },
    _pjax: function (opt) {
        var option = {type: "POST", dataType: 'text', data: {}};
        $.extend(true, option, opt);
        this.ajax(option, function (data) {
            if (!option.container) layer.msg('没有内容装载容器');
            var con = $(option.container);
            con.html(data);
            uilst.uiInit(con);
        });
    },
    ajaxDialog: function (opt) {
        // 页面弹出
        var option = {
            type: "POST", dataType: 'text', data: {},
            layer: {
                type: 1/*, anim: -1*/,
                maxmin: true,
                zIndex: 2017,
                skin: 'layer-ext-icy8',
                closeBtn: 2,
                success: function (layero, index) {
                    // 弹窗获得焦点后 自动加到最顶层
                    var focusLayer = function (event) {
                        if (event.which == 1) {
                            // 只允许左键单击
                            if (!window.layerDialogIndex) {
                                window.layerDialogIndex = 2 * option.layer.zIndex;
                            }
                            if ($(this).hasClass('layui-layer-page')) {
                                $(this).css('z-index', ++window.layerDialogIndex);
                            } else {
                                $(this).parents('.layui-layer.layui-layer-page').css('z-index', ++window.layerDialogIndex)
                            }
                        }
                    }
                    layero.on('click', focusLayer);
                    // 由于标题部分的单击事件禁用了 所以只能监听鼠标事件
                    $('.layui-layer-title', layero).on('mousedown', focusLayer);
                    $('.layui-layer-resize', layero).on('mousedown', focusLayer);
                    // layer.setTop(layero);
                    //  弹窗回调
                    uilst.uiInit(layero);// 自动渲染窗口页面
                }
            }
        };
        option.dataType = 'text';
        $.extend(true, option, opt);
        this.ajax(option, function (str) {
            try {
                var res = ICY8.str2json(str);
                if (res.status != 1) {
                    layer.msg(res.info);
                } else {
                    option.layer.content = res.info;
                    layer.open(option.layer);
                }
            } catch (e) {
                option.layer.content = str;
                layer.open(option.layer);
            }
        });
    },
    closeThisDialog: function (obj) {
        // 关闭本窗口
        var id = $(obj).parents('.layui-layer.layui-layer-page').attr('times');
        layer.close(id);
    },
    // 元素唤醒弹窗
    elemDialog: function (obj) {
        var href = $(obj).attr('href') || '';
        var option = {};
        if (href.length > 0) {
            option.url = href; //默认配置 使用string数据类型
        }
        var tmp = $(obj).data('option');
        tmp = ICY8.str2json(tmp);// json数据
        $.extend(true, option, tmp);// 配置碰撞
        // 是否有弹窗确认
        ICY8.ajaxDialog(option);
    },
    // 元素ajax加载
    elemAjax: function (obj) {
        var _this = obj;
        var href = $(obj).attr('href') || '';
        var option = {type: 'get', dataType: 'json'};//默认配置
        if (href.length > 0) {
            option.url = href;
        }
        var tmp = $(obj).data('option');
        tmp = ICY8.str2json(tmp);// json数据
        $.extend(true, option, tmp);// 配置碰撞
        ICY8.ajaxLayer(option, _this);
    },
    elemPjax: function (obj) {
        var href = $(obj).attr('href') || '';
        var option = {type: 'get'};//默认配置
        if (href.length > 0) {
            option.url = href;
        }
        var tmp = $(obj).data('option');
        tmp = ICY8.str2json(tmp);// json数据
        $.extend(true, option, tmp);// 配置碰撞
        ICY8._pjax(option);
    },
    ajaxConfirm: function (confirm, callback) {
        var option = {
            anim: -1, /*icon: 3,*/ title: '提示', btn: ['确定', '取消'],
            yes: function (index) {
                //do something
                callback(index);
                layer.close(index);
            }
        };
        if (typeof confirm == 'string') {
            option.content = confirm;
        } else {
            $.extend(true, option, confirm);
        }
        layer.open(option);
    },
    ajaxLayer: function (opt, _this, submit) {
        /**
         * 提交成功弹窗提醒
         * */
        // 弹窗提交
            var that = this;
        var option = {type: 'get', dataType: 'json'};//默认配置 默认get提交
        option.layer = {title: false, type: 0, btn: false, time: 1500, closeBtn: 0, shade: 0.3, shadeClose: true};// 弹窗默认配置
        if (typeof opt == 'string') {
            option = {url: opt, type: 'get', dataType: 'json', data: {},}
        } else {
            $.extend(true, option, opt);// 配置碰撞
        }

        // ajax开始
        var call = function (data) {
            if (typeof data == 'object') {
                // json数据
                option.layer.content = data.info;// 弹窗内容
                if (data.status == 1) {
                    option.layer.icon = 1;// 成功的图标
                    // 主动跳转
                    if (data && data.url) {
                        setTimeout(function () {
                            window.location.href = data.url;
                            console.log(data.url);
                        }, 1200);
                    }
                } else option.layer.icon = 2;// 错误的图标
            } else option.layer.content = data;// 弹窗内容
            layer.open(option.layer); //弹出
            if (typeof option.callback == 'function') {
                // 回调处理
                option.callback(data, _this);
            }
        }
        var perform = function () {
            if (submit) {
                // 如果是表单提交则使用jq.form插件
                that.ajaxSubmit(_this, call);
            } else {
                that.ajax(option, call);
            }
        }
        // 是否有弹窗确认
        if (option.confirm) {
            ICY8.ajaxConfirm(option.confirm, function () {
                perform()
            });
        } else perform();
    },
};

/* 页面监听开始 */
window.uilst = {
    uiInit: function ($container) {
        layui.config({base: window.Think.__JS__ + '/'}).use(['common'], function () {
            layui.form.render();
            layui.common.listenSimpleEvent(); // 监听简单事件
        });
        $container = $container || document;// 检索容器
        this.initSubmit($container);
        this.initLink($container);
        this.initDialog($container);
        this.initPage($container);
        this.initDate($container);
        /**
         * 选中、显示
         * 针对下拉框、单选框的监听，如果选中则显示相应元素
         * checkShowTarget属性为对应元素的jq选择器字符串
         */
        $('input[checkShowTarget]', $container).each(function () {
            // 选中显示隐藏
            $(this).off('change').on('change', function () {
                var showTarget = $(this).attr('checkShowTarget');
                if ($(this).prop('checked')) {
                    $(showTarget).show();
                } else {
                    $(showTarget).hide();
                }
            });
        });
        $('input[checkHideTarget]', $container).each(function () {
            $(this).off('change').on('change', function () {
                var hideTarget = $(this).attr('checkHideTarget');
                if ($(this).prop('checked')) {
                    $(hideTarget).hide();
                } else {
                    $(hideTarget).show();
                }
            });
        });
        $('[role="slideThat"]', $container).each(function () {
            $(this).on('click', function () {
                var target = $(this).attr('target');
                var speed = $(this).attr('speed') || 'fast';
                var obj = {};
                if (target.length > 0) {
                    if (target.toLowerCase() == 'this') {
                        obj = $(this);
                    } else {
                        obj = $(target);
                    }
                } else {
                    obj = $(this);
                }
                obj.slideToggle(speed, function () {
                    $(this).css('overflow', 'visible')
                });
            });
        });
    },
    // 元素监听
    initElem: function (_this, obj) {
        var event = $(_this).attr('lay-event');
        if (event == 'ajaxGet') {
            ICY8.elemAjax(_this);
        } else if (event == 'popDialog') {
            ICY8.elemDialog(_this);
        } else if (event == 'refreshTable') {
            layui.table.reload(obj.config.id);
        } else if (event == 'pjax') {
            ICY8.elemPjax(_this);
        } else {
            // layui.element.tabAdd('icy8-layout-tabs',{title:'tetete', content:'fsdfsdfsd',id:'iic'});
            // $(_this).off('click').on('click',layui.common.events['click'][event]);
            // $(_this).click();
        }
    },
    initSubmit: function ($container) {
        // 监听到ajaxSubmit属性、type='ajaxSubmit'、target='ajaxSubmit'均使用ajax提交，并使用layer弹窗提示
        // data-option='{}' 弹窗配置的json数据
        $('form[type="ajaxSubmit"],form[ajaxSubmit]', $container).each(function () {
            $(this).off('submit').on('submit', function () {
                var user_option = $(this).data('option');
                user_option = ICY8.str2json(user_option);
                var option = {url: $(this).attr('action'), type: $(this).attr('method'), data: $(this).serialize()};//弹窗默认配置
                if (user_option) {
                    $.extend(true, option, user_option);
                }
                ICY8.ajaxLayer(option, this, true); // ajax提交
                return false;
            });
        });
    },
    initLink: function ($container) {
        /**
         * 监听锚点ajax加载
         * data-option='{}' 属性为ajax配置的json数据confirm为加载前的提示文字，如果存在confirm则会弹窗提示，否则直接ajax加载
         */
        $('a[ajaxGet]', $container).each(function () {
            $(this).off('click').on('click', function () {
                var href = $(this).attr('href');
                if (href.length <= 0) {
                    return false;
                }
                ICY8.elemAjax(this);
                return false;
            });
        });
    },
    initDialog: function ($container) {
        /**
         * url页面弹出窗
         */
        $('a[popDialog]', $container).each(function () {
            $(this).off('click').on('click', function () {
                var href = $(this).attr('href');
                if (href.length <= 0) return false;
                ICY8.elemDialog(this);
                return false;
            });
        });
    },
    initPage: function ($container) {
        var _this = this;
        // 微模拟pjax无刷新加载指定容器内容 多用于嵌入式弹窗
        $('div[tankPage], span[tankPage], ul[tankPage]', $container).each(function () {
            // 容器级的a标签监听  为了兼顾thinkphp的分页连接的获取
            var option = $(this).data('option');
            option = ICY8.str2json(option);
            $(this).find('a').each(function () {
                $(this).on('click', function () {
                    var opt = {url: $(this).attr('href')};
                    $.extend(true, option, opt);
                    ICY8._pjax(option);
                    return false;
                });
            });
        });
        $('a[ajaxPage]', $container).each(function () {
            // 单体a标签监听  为了兼顾thinkphp的分页连接的获取
            $(this).on('click', function () {
                var opt = $(this).data('option');
                opt = ICY8.str2json(opt);
                var option = {url: $(this).attr('href')};
                $.extend(true, option, opt);
                ICY8._pjax(option);
                return false;
            });
        });
        $('form[ajaxPage]', $container).each(function () {
            // form提交的容器加载
            $(this).off('submit').on('submit', function () {
                var opt = $(this).data('option');
                opt = ICY8.str2json(opt);
                var option = {url: $(this).attr('action'), data: $(this).serialize(), type: $(this).attr('method')};
                $.extend(true, option, opt);
                ICY8._pjax(option);
                return false;
            });
        });
    },
    initDate: function ($container) {
        $('input[role="date"]', $container).each(function () {
            var opt = $(this).data('option'),
                _this = this
            opt = ICY8.str2json(opt);
            layui.use('laydate', function () {
                var laydate = layui.laydate;
                var option = {
                    'elem': _this,
                    'type': 'datetime',
                    'format': 'yyyy-MM-dd HH:mm:ss',
                    'mark': {
                        '0-9-18': '国耻'
                        , '0-0-15': '中旬'
                        , '0-12-31': '跨年'
                        ,
                    },
                    // 'value': new Date(),
                }
                $.extend(true, option, opt);
                laydate.render(option);
            });
        });
    },
};
$(document).ready(function () {
    uilst.uiInit();
});